-- 1.参数列表
-- 1.1 优惠券id
local voucherId = ARGV[1]
-- 1.2 用户id
local userId = ARGV[2]
-- 2. 数据key
---2.1 库存key
local stockKey = 'seckill:stock:' .. voucherId
-- 2.2 订单key(已下单用户key集合)
local orderKey = 'seckill:order:' .. voucherId

-- 3. 业务逻辑
-- 初始化变量
local stock, beginTime, endTime

-- 3.1 获取优惠券信息
local voucherStr = redis.call('hgetall', stockKey)
for i = 1, #voucherStr, 2 do
    local key = voucherStr[i]
    local value = voucherStr[i+1]
    if key == 'stock' then
        stock = tonumber(value) or 0  -- 转换为数字，提供默认值
    elseif key == 'beginTime' then
        beginTime = tonumber(value)  -- 转换为数字
    elseif key == 'endTime' then
        endTime = tonumber(value)    -- 转换为数字
    end
end

-- 判断是否为可用时间
-- 确保beginTime和endTime都存在且可以转换为数字
local currentTime = tonumber(redis.call('time')[1])

if (beginTime == nil or endTime == nil) then
    return 4  -- 秒杀未配置正确时间
end

if ( beginTime > currentTime or endTime < currentTime  ) then
        -- 不在可用时间
        return 3
end

-- 判断库存是否充足
if (stock <= 0) then
    -- 库存不足
    return 1
end

-- 判断用户是否下单
if (redis.call('sismember', orderKey, userId) == 1) then
    -- 用户已下单
    return 2
end

-- 扣减库存
redis.call('hincrby', stockKey, 'stock', -1)
-- 将用户id存入优惠券集合
redis.call('sadd', orderKey, userId)
return 0